
package mx.unam.fciencias.actividadesculturales.entidades.db;

import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import mx.unam.fciencias.actividadesculturales.entidades.db.enums.TipoActividad;
import mx.unam.fciencias.actividadesculturales.entidades.db.enums.TipoServicio;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

/**
 * Clase que implementa los atributos de la entidad actividad.
 * @author lumartin
 */
@Entity
@Table(schema = "cultura")
public class Actividad implements java.io.Serializable {

    @Id
    @SequenceGenerator(name = "actividad_id_seq",
            sequenceName = "actividad_id_seq")
    @GeneratedValue(generator = "actividad_id_seq",
            strategy = GenerationType.AUTO)
    private Long id_actividad;

    @Column(length = 512, nullable = false)
    private String nombre_actividad;

    //@Basic( fetch = FetchType.EAGER )
    @Enumerated(EnumType.STRING)
    private TipoActividad tipo;

    //@Basic( fetch = FetchType.EAGER )
    @Enumerated(EnumType.STRING)
    private TipoServicio tipo_servicio;

    private String duracion;

    @Column(nullable = false)
    private String hora;

    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date fecha_inicio;

    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date fecha_termino;

    @ManyToMany
    @JoinTable(
        name="Act_Esp", schema = "cultura",
        joinColumns={@JoinColumn(name="id_actividad", referencedColumnName="id_actividad")},
        inverseJoinColumns={@JoinColumn(name="id_espacio", referencedColumnName="id_espacio")})
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Espacio> espacios;

    @ManyToMany
    @JoinTable(
        name="Act_Ent_Acad", schema = "cultura",
        joinColumns={@JoinColumn(name="id_actividad", referencedColumnName="id_actividad")},
        inverseJoinColumns={@JoinColumn(name="id_ent_acad", referencedColumnName="id_ent_acad")})
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<EntidadAcademica> entAcademicas;

    @ManyToMany
    @JoinTable(
        name="Act_Pers", schema = "cultura",
        joinColumns={@JoinColumn(name="id_actividad", referencedColumnName="id_actividad")},
        inverseJoinColumns={@JoinColumn(name="id", referencedColumnName="id")})
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Persona> personas;

    public Actividad() { }

    public Long getId_actividad(){
        return id_actividad;
    }

    public void setId_actividad(Long id_actividad){
        this.id_actividad = id_actividad;
    }

    public String getDuracion() {
        return duracion;
    }

    public void setDuracion(String duracion) {
        this.duracion = duracion;
    }

    public Date getFecha_inicio() {
        return fecha_inicio;
    }

    public void setFecha_inicio(Date fecha_inicio) {
        this.fecha_inicio = fecha_inicio;
    }

    public Date getFecha_termino() {
        return fecha_termino;
    }

    public void setFecha_termino(Date fecha_termino) {
        this.fecha_termino = fecha_termino;
    }

    public String getHora() {
        return hora;
    }

    public void setHora(String hora) {
        this.hora = hora;
    }

    public String getNombre_actividad() {
        return nombre_actividad;
    }

    public void setNombre_actividad(String nomb_actividad) {
        this.nombre_actividad = nomb_actividad;
    }

    public TipoActividad getTipo() {
        return tipo;
    }

    public void setTipo(TipoActividad tipo) {
        this.tipo = tipo;
    }

    public TipoServicio getTipo_servicio() {
        return tipo_servicio;
    }

    public void setTipo_servicio(TipoServicio tipo_servicio) {
        this.tipo_servicio = tipo_servicio;
    }

    public List<Espacio> getEspacios() {
        return espacios;
    }

    public void setEspacios(List<Espacio> espacios) {
        this.espacios = espacios;
    }

    public List<EntidadAcademica> getEntAcademicas() {
        return entAcademicas;
    }

    public void setEntAcademicas(List<EntidadAcademica> entAcademicas) {
        this.entAcademicas = entAcademicas;
    }

    public List<Persona> getPersonas() {
        return personas;
    }

    public void setPersonas(List<Persona> personas) {
        this.personas = personas;
    }

    public String toString() {
	final String DIVIDER = ", ";

	StringBuffer buf = new StringBuffer();
	buf.append(this.getClass().getSimpleName() + ": ");
	buf.append("[");
	buf.append("id_actividad=" + id_actividad + DIVIDER);
	buf.append("duracion=" + duracion + DIVIDER);
	buf.append("fecha_inicio=" + fecha_inicio + DIVIDER);
	buf.append("fecha_termino=" + fecha_termino + DIVIDER);
	buf.append("hora=" + hora + DIVIDER);
        buf.append("nombre_actividad=" + nombre_actividad + DIVIDER);
        buf.append("tipo=" + tipo + DIVIDER);
        buf.append("tipo_servicio=" + tipo_servicio + DIVIDER);
        buf.append("espacios=" + espacios + DIVIDER);
        buf.append("entAcademicas=" + entAcademicas + DIVIDER);
        buf.append("personas=" + personas + DIVIDER);
	buf.append("]");
	return buf.toString();
    }

    // The need for an equals() method is discussed at http://www.hibernate.org/109.html

    @Override
    public boolean equals(Object obj) {
    	return (obj == this) || (obj instanceof Actividad) 
                && id_actividad != null
                && id_actividad.equals(((Actividad) obj).getId_actividad());
    }

    // The need for a hashCode() method is discussed at http://www.hibernate.org/109.html

    @Override
    public int hashCode() {
    	return getId_actividad() == null ? super.hashCode() : getId_actividad().hashCode();
    }
}
